const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/mongo-relation')
//之前的例子是通过博客查分类，现在通过分类列表调出对应的posts博客
//语法上有区别
const CategorySchema = new mongoose.Schema({
    name:{type:String}
},{
    //调用toJSON的时候把虚拟字段加进去,默认他是不加虚拟字段的
    toJSON:{ virtuals:true }
})
//在CategorySchema上加一个虚拟字段叫posts,因为本身没有这个字段，所以把它定义成一个虚拟字段
//第二个参数是针对第一个参数配置的，包括他的来源，是从哪里查的
CategorySchema.virtual('posts',{
    ref:'Post',//来源,参考Post模型中去，从那里找
    localField:'_id',//用本模型的什么键去关联,表示用分类里面的_id字段去关联外面的foreignField外键（Post里面的一个键）
    foreignField:'categories',
    //靠上面的三个配置决定是怎么关联的
    justOne:false//表示查出来的数据是不是只有一条，是一个对象还是数组
})
const Category = mongoose.model('Category',CategorySchema)
const postSchema = new mongoose.Schema({
    title:{type:String},
    body:{type:String},
    categories:[{type:mongoose.SchemaTypes.ObjectId,ref:'Category'}]
})
const Post = mongoose.model('Post',postSchema)
async function main(){
    //const cats = await Category.find();
    //分类里面添加了关联的Post,所以查找分类集合后面可以使用查找关联内容的populate
    //populate的参数是字段名称
    //const cats = await Category.find().populate('posts')
    //console.log(cats);
    //用json转一下，在express里是没有问题的因为express中数据返回的话默认使用json返回的
    //console.log(JSON.stringify(cats));
    //在分类schema的地方也要，添加第二个对象参数进行配置
    //在express中返回的结果，想查看分类对应的文章，可以在schema加上toJson配置。如果打印的时候不想转字符串，也可以在populate后面加上.lean(),表示输出纯粹的json数据
    const cats = await Category.find().populate('posts').lean()
    console.log(cats);
}
main()